| @@ -10,13 +10,15 @@ from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLogin | ||
| 10 | 10 |  | 
| 11 | 11 | class LensmanInfoAdmin(admin.ModelAdmin): | 
| 12 | 12 |      exclude = ('username', 'password', 'encryption') | 
| 13 | +    list_display = ('lensman_id', 'unionid', 'username', 'name', 'sex', 'phone', 'location', 'proportion', 'nomark', 'origin', 'balance', 'user_status', 'outtake_status', 'status', 'created_at', 'updated_at') | |
| 14 | +    list_filter = ('is_common_lensman', 'is_outtake_lensman', 'sex', 'user_status', 'outtake_status', 'status') | |
| 13 | 15 |      readonly_fields = ('lensman_id', ) | 
| 14 | -    list_display = ('lensman_id', 'unionid', 'username', 'name', 'sex', 'phone', 'location', 'proportion', 'nomark', 'origin', 'balance', 'user_status', 'status', 'created_at', 'updated_at') | |
| 15 | 16 |      search_fields = ('name', 'phone', 'location') | 
| 16 | -    list_filter = ('sex', 'user_status', 'status') | |
| 17 | 17 |  | 
| 18 | 18 | @transaction.atomic | 
| 19 | 19 | def save_model(self, request, obj, form, change): | 
| 20 | + obj.save() | |
| 21 | + | |
| 20 | 22 | if not obj.lensman_id: | 
| 21 | 23 | try: | 
| 22 | 24 | user_id = UserInfo.objects.select_for_update().get(unionid=obj.unionid).user_id | 
| @@ -33,8 +35,12 @@ class LensmanInfoAdmin(admin.ModelAdmin): | ||
| 33 | 35 | 'location': obj.location, | 
| 34 | 36 | 'islensman': True, | 
| 35 | 37 | 'user_status': obj.user_status, | 
| 38 | + 'is_common_lensman': obj.is_common_lensman, | |
| 39 | + 'is_outtake_lensman': obj.is_outtake_lensman, | |
| 36 | 40 | } | 
| 41 | + | |
| 37 | 42 | user, created = UserInfo.objects.get_or_create(user_id=obj.lensman_id, defaults=fields) | 
| 43 | + | |
| 38 | 44 | if not created: | 
| 39 | 45 |              fields.pop('user_from', None) | 
| 40 | 46 | for key, value in fields.iteritems(): | 
| @@ -52,10 +58,10 @@ class LensmanIncomeExpensesInfoAdmin(admin.ModelAdmin): | ||
| 52 | 58 |  | 
| 53 | 59 |  | 
| 54 | 60 | class TourGuideInfoAdmin(admin.ModelAdmin): | 
| 55 | -    readonly_fields = ('tourguide_id', ) | |
| 56 | 61 |      list_display = ('tourguide_id', 'unionid', 'name', 'sex', 'phone', 'location', 'no', 'user_status', 'status', 'created_at', 'updated_at') | 
| 57 | -    search_fields = ('name', 'phone', 'location', 'no') | |
| 58 | 62 |      list_filter = ('sex', 'user_status', 'status') | 
| 63 | +    readonly_fields = ('tourguide_id', ) | |
| 64 | +    search_fields = ('name', 'phone', 'location', 'no') | |
| 59 | 65 |  | 
| 60 | 66 | @transaction.atomic | 
| 61 | 67 | def save_model(self, request, obj, form, change): | 
| @@ -76,8 +82,11 @@ class TourGuideInfoAdmin(admin.ModelAdmin): | ||
| 76 | 82 | 'location': obj.location, | 
| 77 | 83 | 'istourguide': True, | 
| 78 | 84 | 'user_status': obj.user_status, | 
| 85 | + 'outtake_status': obj.outtake_status, | |
| 79 | 86 | } | 
| 87 | + | |
| 80 | 88 | user, created = UserInfo.objects.get_or_create(user_id=obj.tourguide_id, defaults=fields) | 
| 89 | + | |
| 81 | 90 | if not created: | 
| 82 | 91 |              fields.pop('user_from', None) | 
| 83 | 92 | for key, value in fields.iteritems(): | 
| @@ -86,10 +95,10 @@ class TourGuideInfoAdmin(admin.ModelAdmin): | ||
| 86 | 95 |  | 
| 87 | 96 |  | 
| 88 | 97 | class UserInfoAdmin(admin.ModelAdmin): | 
| 98 | +    list_display = ('user_id', 'user_from', 'username', 'openid', 'unionid', 'name', 'sex', 'nickname', 'phone', 'location', 'islensman', 'istourguide', 'balance', 'user_status', 'outtake_status', 'status', 'created_at', 'updated_at') | |
| 99 | +    list_filter = ('user_from', 'sex', 'islensman', 'istourguide', 'user_status', 'outtake_status', 'status') | |
| 89 | 100 |      readonly_fields = ('user_id', ) | 
| 90 | -    list_display = ('user_id', 'user_from', 'username', 'openid', 'unionid', 'name', 'sex', 'nickname', 'phone', 'location', 'islensman', 'istourguide', 'balance', 'user_status', 'status', 'created_at', 'updated_at') | |
| 91 | 101 |      search_fields = ('name', 'phone', 'location') | 
| 92 | -    list_filter = ('user_from', 'sex', 'islensman', 'istourguide', 'user_status', 'status') | |
| 93 | 102 |  | 
| 94 | 103 |  | 
| 95 | 104 | class UserLoginLogInfoAdmin(admin.ModelAdmin): | 
| @@ -0,0 +1,55 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.3 on 2017-09-17 10:25 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | + | |
| 7 | + | |
| 8 | +class Migration(migrations.Migration): | |
| 9 | + | |
| 10 | + dependencies = [ | |
| 11 | +        ('account', '0023_auto_20170709_1923'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.AddField( | |
| 16 | + model_name='lensmaninfo', | |
| 17 | + name='is_common_lensman', | |
| 18 | + field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u4e3a\u666e\u901a\u6444\u5f71\u5e08', verbose_name='is_common_lensman'), | |
| 19 | + ), | |
| 20 | + migrations.AddField( | |
| 21 | + model_name='lensmaninfo', | |
| 22 | + name='is_outtake_lensman', | |
| 23 | + field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u4e3a\u82b1\u7d6e\u6444\u5f71\u5e08', verbose_name='is_outtake_lensman'), | |
| 24 | + ), | |
| 25 | + migrations.AddField( | |
| 26 | + model_name='lensmaninfo', | |
| 27 | + name='outtake_status', | |
| 28 | + field=models.IntegerField(choices=[(-1, '\u5df2\u62d2\u7edd'), (0, '\u672a\u9a8c\u8bc1'), (1, '\u5df2\u6fc0\u6d3b'), (2, '\u5df2\u7981\u7528'), (3, '\u5df2\u5220\u9664'), (10, '\u5df2\u5206\u914d')], default=0, help_text='\u82b1\u7d6e\u6444\u5f71\u5e08\u5ba1\u6838\u72b6\u6001', verbose_name='outtake_status'), | |
| 29 | + ), | |
| 30 | + migrations.AddField( | |
| 31 | + model_name='userinfo', | |
| 32 | + name='is_common_lensman', | |
| 33 | + field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u4e3a\u666e\u901a\u6444\u5f71\u5e08', verbose_name='is_common_lensman'), | |
| 34 | + ), | |
| 35 | + migrations.AddField( | |
| 36 | + model_name='userinfo', | |
| 37 | + name='is_outtake_lensman', | |
| 38 | + field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u4e3a\u82b1\u7d6e\u6444\u5f71\u5e08', verbose_name='is_outtake_lensman'), | |
| 39 | + ), | |
| 40 | + migrations.AddField( | |
| 41 | + model_name='userinfo', | |
| 42 | + name='outtake_status', | |
| 43 | + field=models.IntegerField(choices=[(0, '\u672a\u9a8c\u8bc1'), (1, '\u5df2\u6fc0\u6d3b'), (2, '\u5df2\u7981\u7528'), (3, '\u5df2\u5220\u9664'), (10, '\u5df2\u5206\u914d')], default=0, help_text='\u82b1\u7d6e\u6444\u5f71\u5e08\u72b6\u6001', verbose_name='outtake_status'), | |
| 44 | + ), | |
| 45 | + migrations.AlterField( | |
| 46 | + model_name='lensmaninfo', | |
| 47 | + name='user_status', | |
| 48 | + field=models.IntegerField(choices=[(-1, '\u5df2\u62d2\u7edd'), (0, '\u672a\u9a8c\u8bc1'), (1, '\u5df2\u6fc0\u6d3b'), (2, '\u5df2\u7981\u7528'), (3, '\u5df2\u5220\u9664'), (10, '\u5df2\u5206\u914d')], default=0, help_text='\u666e\u901a\u6444\u5f71\u5e08\u5ba1\u6838\u72b6\u6001', verbose_name='user_status'), | |
| 49 | + ), | |
| 50 | + migrations.AlterField( | |
| 51 | + model_name='userinfo', | |
| 52 | + name='user_status', | |
| 53 | + field=models.IntegerField(choices=[(0, '\u672a\u9a8c\u8bc1'), (1, '\u5df2\u6fc0\u6d3b'), (2, '\u5df2\u7981\u7528'), (3, '\u5df2\u5220\u9664'), (10, '\u5df2\u5206\u914d')], default=0, help_text='\u7528\u6237\u72b6\u6001', verbose_name='user_status'), | |
| 54 | + ), | |
| 55 | + ] | 
| @@ -4,10 +4,10 @@ from django.db import models | ||
| 4 | 4 | from django.utils.translation import ugettext_lazy as _ | 
| 5 | 5 | from jsonfield import JSONField | 
| 6 | 6 |  | 
| 7 | -from pai2.basemodels import CreateUpdateMixin | |
| 7 | +from pai2.basemodels import CreateUpdateMixin, LensmanTypeBoolMixin, LensmanTypeMixin | |
| 8 | 8 |  | 
| 9 | 9 |  | 
| 10 | -class LensmanInfo(CreateUpdateMixin): | |
| 10 | +class LensmanInfo(CreateUpdateMixin, LensmanTypeBoolMixin): | |
| 11 | 11 | MALE = 1 | 
| 12 | 12 | FEMALE = 0 | 
| 13 | 13 |  | 
| @@ -54,7 +54,8 @@ class LensmanInfo(CreateUpdateMixin): | ||
| 54 | 54 | freeze_income_balance = models.IntegerField(_(u'freeze_income_balance'), default=0, help_text=u'摄影师收入冻结余额(分)') | 
| 55 | 55 | freeze_expense_balance = models.IntegerField(_(u'freeze_expense_balance'), default=0, help_text=u'摄影师支出冻结余额(分)') | 
| 56 | 56 |  | 
| 57 | - user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED) | |
| 57 | + user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'普通摄影师审核状态') | |
| 58 | + outtake_status = models.IntegerField(_(u'outtake_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'花絮摄影师审核状态') | |
| 58 | 59 | refused_reason = models.TextField(_(u'refused_reason'), blank=True, null=True, help_text=u'审核拒绝原因') | 
| 59 | 60 |  | 
| 60 | 61 | signup_ip = models.CharField(_(u'signup_ip'), max_length=255, blank=True, null=True, help_text=_(u'注册IP')) | 
| @@ -68,17 +69,30 @@ class LensmanInfo(CreateUpdateMixin): | ||
| 68 | 69 | def __unicode__(self): | 
| 69 | 70 | return unicode(self.pk) | 
| 70 | 71 |  | 
| 71 | - @property | |
| 72 | - def data(self): | |
| 72 | + def final_status(self, lensman_type): | |
| 73 | + if lensman_type == self.COMMON: # 普通摄影师校验 | |
| 74 | + return self.user_status | |
| 75 | + elif lensman_type == self.OUTTAKE: # 花絮摄影师校验 | |
| 76 | + return self.outtake_status | |
| 77 | + return self.user_status | |
| 78 | + | |
| 79 | + def data(self, lensman_type): | |
| 73 | 80 |          return { | 
| 74 | 81 | 'name': self.name, | 
| 75 | 82 | 'sex': self.sex, | 
| 76 | 83 | 'phone': self.phone, | 
| 77 | 84 | 'location': self.location, | 
| 78 | - 'status': self.user_status, | |
| 85 | + 'status': self.final_status(lensman_type), | |
| 79 | 86 | 'refused_reason': self.refused_reason, | 
| 80 | 87 | } | 
| 81 | 88 |  | 
| 89 | + def modified(self, lensman_type): | |
| 90 | + if lensman_type == self.COMMON: # 普通摄影师校验 | |
| 91 | + return self.user_status in [self.UNVERIFIED, self.REFUSED] | |
| 92 | + elif lensman_type == self.OUTTAKE: # 花絮摄影师校验 | |
| 93 | + return self.outtake_status in [self.UNVERIFIED, self.REFUSED] | |
| 94 | + return False | |
| 95 | + | |
| 82 | 96 |  | 
| 83 | 97 | class LensmanLoginLogInfo(CreateUpdateMixin): | 
| 84 | 98 | SUCCESS = 0 | 
| @@ -198,6 +212,10 @@ class TourGuideInfo(CreateUpdateMixin): | ||
| 198 | 212 | 'refused_reason': self.refused_reason, | 
| 199 | 213 | } | 
| 200 | 214 |  | 
| 215 | + @property | |
| 216 | + def modified(self): | |
| 217 | + return self.user_status in [self.UNVERIFIED, self.REFUSED] | |
| 218 | + | |
| 201 | 219 |  | 
| 202 | 220 | class WechatInfo(CreateUpdateMixin): | 
| 203 | 221 | MALE = 1 | 
| @@ -226,7 +244,7 @@ class WechatInfo(CreateUpdateMixin): | ||
| 226 | 244 | return unicode(self.pk) | 
| 227 | 245 |  | 
| 228 | 246 |  | 
| 229 | -class UserInfo(CreateUpdateMixin): | |
| 247 | +class UserInfo(CreateUpdateMixin, LensmanTypeBoolMixin): | |
| 230 | 248 | APP_USER = 0 | 
| 231 | 249 | WX_USER = 1 | 
| 232 | 250 | USER_USER = 8 | 
| @@ -302,7 +320,8 @@ class UserInfo(CreateUpdateMixin): | ||
| 302 | 320 | freeze_income_balance = models.IntegerField(_(u'freeze_income_balance'), default=0, help_text=u'用户收入冻结余额(分)') | 
| 303 | 321 | freeze_expense_balance = models.IntegerField(_(u'freeze_expense_balance'), default=0, help_text=u'用户支出冻结余额(分)') | 
| 304 | 322 |  | 
| 305 | - user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED) | |
| 323 | + user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'用户状态') | |
| 324 | + outtake_status = models.IntegerField(_(u'outtake_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'花絮摄影师状态') | |
| 306 | 325 |  | 
| 307 | 326 | assign_ip = models.CharField(_(u'assign_ip'), max_length=255, blank=True, null=True, help_text=_(u'分配IP')) | 
| 308 | 327 | assign_at = models.DateTimeField(_(u'assign_at'), blank=True, null=True, help_text=_(u'分配时间')) | 
| @@ -344,6 +363,7 @@ class UserInfo(CreateUpdateMixin): | ||
| 344 | 363 | 'username': self.username, | 
| 345 | 364 | 'nickname': self.nickname, | 
| 346 | 365 | 'avatar': self.avatar, | 
| 366 | + 'lensman_type': self.lensman_type, | |
| 347 | 367 | } | 
| 348 | 368 |  | 
| 349 | 369 |  | 
| @@ -10,18 +10,25 @@ from utils.redis.connect import r | ||
| 10 | 10 |  | 
| 11 | 11 | @logit | 
| 12 | 12 | def login_qrcode_api(request): | 
| 13 | +    lensman_type = int(request.POST.get('lensman_type', 0)) | |
| 13 | 14 |      unionid = request.POST.get('unionid', '') | 
| 14 | 15 |      token = request.POST.get('token', '') | 
| 15 | 16 |  | 
| 16 | 17 | if not r.token_exists(unionid, token): | 
| 17 | 18 | return response(TokenStatusCode.TOKEN_HAS_EXPIRED) | 
| 18 | 19 |  | 
| 20 | + # 用户校验 | |
| 19 | 21 | try: | 
| 20 | 22 | user = UserInfo.objects.get(unionid=unionid, islensman=True, status=True) | 
| 21 | 23 | except UserInfo.DoesNotExist: | 
| 22 | 24 | return response(LensmanStatusCode.LENSMAN_NOT_FOUND) | 
| 23 | 25 |  | 
| 24 | - if user.user_status != UserInfo.ACTIVATED: | |
| 25 | - return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) | |
| 26 | + # 用户状态校验 | |
| 27 | + if lensman_type == UserInfo.COMMON: # 普通摄影师校验 | |
| 28 | + if user.is_common_lensman and user.user_status != UserInfo.ACTIVATED: | |
| 29 | + return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) | |
| 30 | + elif lensman_type == UserInfo.OUTTAKE: # 花絮摄影师校验 | |
| 31 | + if user.is_outtake_lensman and user.outtake_status != UserInfo.ACTIVATED: | |
| 32 | + return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) | |
| 26 | 33 |  | 
| 27 | 34 | return response(200, 'Lensman Login Success', u'摄影师登录成功', user.data) | 
| @@ -32,6 +32,7 @@ from utils.storage_qiniu_utils import file_save | ||
| 32 | 32 | @logit | 
| 33 | 33 | def lensman_submit_api(request): | 
| 34 | 34 | """ 摄影师信息提交 """ | 
| 35 | +    lensman_type = int(request.POST.get('lensman_type', 0)) | |
| 35 | 36 |      unionid = request.POST.get('unionid', '') | 
| 36 | 37 |      openid = request.POST.get('openid', '') | 
| 37 | 38 |      phone = request.POST.get('phone', '') | 
| @@ -48,28 +49,48 @@ def lensman_submit_api(request): | ||
| 48 | 49 | } | 
| 49 | 50 |  | 
| 50 | 51 | lensman, created = LensmanInfo.objects.get_or_create(unionid=unionid, defaults=fields) | 
| 52 | + | |
| 51 | 53 | # 状态为 UNVERIFIED 的允许修改, 其他需要登录摄影师 APP 进行信息的修改 | 
| 52 | - if lensman.user_status not in [LensmanInfo.UNVERIFIED, LensmanInfo.REFUSED]: | |
| 53 | - return response(LensmanStatusCode.LENSMAN_ALREADY_NOT_UNVERIFIED) | |
| 54 | - if not created: | |
| 55 | - for key, value in fields.iteritems(): | |
| 56 | - setattr(lensman, key, value) | |
| 57 | - lensman.save() | |
| 54 | + # 用户状态校验 | |
| 55 | + if lensman_type == UserInfo.COMMON: # 普通摄影师校验 | |
| 56 | + if lensman.is_common_lensman and lensman.user_status not in [LensmanInfo.UNVERIFIED, LensmanInfo.REFUSED]: | |
| 57 | + return response(LensmanStatusCode.LENSMAN_ALREADY_NOT_UNVERIFIED) | |
| 58 | + elif lensman_type == UserInfo.OUTTAKE: # 花絮摄影师校验 | |
| 59 | + if lensman.is_common_lensman and lensman.user_status not in [LensmanInfo.UNVERIFIED, LensmanInfo.REFUSED]: | |
| 60 | + return response(LensmanStatusCode.LENSMAN_ALREADY_NOT_UNVERIFIED) | |
| 61 | + | |
| 62 | + for key, value in fields.iteritems(): | |
| 63 | + setattr(lensman, key, value) | |
| 64 | + | |
| 65 | + if lensman_type == LensmanInfo.COMMON: | |
| 66 | + lensman.is_common_lensman = True | |
| 67 | + elif lensman_type == LensmanInfo.OUTTAKE: | |
| 68 | + lensman.is_outtake_lensman = True | |
| 69 | + | |
| 70 | + lensman.save() | |
| 58 | 71 |  | 
| 59 | -    return response(200, 'Submit Success', u'提交成功', {}) | |
| 72 | + return response(200, 'Submit Success', u'提交成功') | |
| 60 | 73 |  | 
| 61 | 74 |  | 
| 62 | 75 | @logit | 
| 63 | 76 | @transaction.atomic | 
| 64 | 77 | def lensman_wx_authorize_api(request): | 
| 78 | +    lensman_type = int(request.POST.get('lensman_type', 0)) | |
| 79 | +    unionid = request.POST.get('unionid', '') | |
| 80 | + | |
| 81 | + # 用户校验 | |
| 65 | 82 | try: | 
| 66 | -        user = UserInfo.objects.select_for_update().get(unionid=request.POST.get('unionid', ''), islensman=True, status=True) | |
| 83 | + user = UserInfo.objects.select_for_update().get(unionid=unionid, islensman=True, status=True) | |
| 67 | 84 | except UserInfo.DoesNotExist: | 
| 68 | 85 | return response(LensmanStatusCode.LENSMAN_NOT_FOUND) | 
| 69 | 86 |  | 
| 70 | - # 用户是否激活 | |
| 71 | - if user.user_status != UserInfo.ACTIVATED: | |
| 72 | - return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) | |
| 87 | + # 用户状态校验 | |
| 88 | + if lensman_type == UserInfo.COMMON: # 普通摄影师校验 | |
| 89 | + if user.is_common_lensman and user.user_status != UserInfo.ACTIVATED: | |
| 90 | + return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) | |
| 91 | + elif lensman_type == UserInfo.OUTTAKE: # 花絮摄影师校验 | |
| 92 | + if user.is_outtake_lensman and user.outtake_status != UserInfo.ACTIVATED: | |
| 93 | + return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) | |
| 73 | 94 |  | 
| 74 | 95 | # Set User Key's Value | 
| 75 | 96 |      user.openid_lensman = request.POST.get('openid', '') | 
| @@ -114,6 +135,7 @@ def lensman_price_fix_api(request): | ||
| 114 | 135 | @logit | 
| 115 | 136 | def lensman_photo_upload_api(request): | 
| 116 | 137 | """ 摄影师照片上传 """ | 
| 138 | +    lensman_type = int(request.POST.get('lensman_type', 0)) | |
| 117 | 139 |      user_id = lensman_id = request.POST.get('user_id', '') | 
| 118 | 140 |      nickname = request.POST.get('nickname', '') | 
| 119 | 141 |      group_id = request.POST.get('group_id', '') | 
| @@ -125,9 +147,17 @@ def lensman_photo_upload_api(request): | ||
| 125 | 147 |  | 
| 126 | 148 | # 用户校验 | 
| 127 | 149 | try: | 
| 128 | - user = UserInfo.objects.get(user_id=user_id, status=True) | |
| 150 | + user = UserInfo.objects.get(user_id=user_id, islensman=True, status=True) | |
| 129 | 151 | except UserInfo.DoesNotExist: | 
| 130 | - return response(UserStatusCode.USER_NOT_FOUND) | |
| 152 | + return response(LensmanStatusCode.LENSMAN_NOT_FOUND) | |
| 153 | + | |
| 154 | + # 用户状态校验 | |
| 155 | + if lensman_type == UserInfo.COMMON: # 普通摄影师校验 | |
| 156 | + if user.is_common_lensman and user.user_status != UserInfo.ACTIVATED: | |
| 157 | + return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) | |
| 158 | + elif lensman_type == UserInfo.OUTTAKE: # 花絮摄影师校验 | |
| 159 | + if user.is_outtake_lensman and user.outtake_status != UserInfo.ACTIVATED: | |
| 160 | + return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) | |
| 131 | 161 |  | 
| 132 | 162 | if not group_id: | 
| 133 | 163 | # 判断通过 session_id 创建的群组是否存在,如果不存在,则直接创建 | 
| @@ -186,6 +216,7 @@ def lensman_photo_upload_api(request): | ||
| 186 | 216 | 'lensman_photo_id': photo.photo_id, | 
| 187 | 217 |                  'nomark': price_info.get('nomark', 999), | 
| 188 | 218 |                  'origin': price_info.get('origin', 999), | 
| 219 | + 'lensman_type': lensman_type, | |
| 189 | 220 | } | 
| 190 | 221 | ) | 
| 191 | 222 |  | 
| @@ -0,0 +1,20 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.3 on 2017-09-17 10:06 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | + | |
| 7 | + | |
| 8 | +class Migration(migrations.Migration): | |
| 9 | + | |
| 10 | + dependencies = [ | |
| 11 | +        ('group', '0041_auto_20170825_1342'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.AddField( | |
| 16 | + model_name='groupphotoinfo', | |
| 17 | + name='lensman_type', | |
| 18 | + field=models.IntegerField(choices=[(0, '\u666e\u901a\u6444\u5f71\u5e08'), (10, '\u82b1\u7d6e\u6444\u5f71\u5e08')], db_index=True, default=-1, help_text='\u6444\u5f71\u5e08\u7c7b\u522b', verbose_name='lensman_type'), | |
| 19 | + ), | |
| 20 | + ] | 
| @@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _ | ||
| 5 | 5 | from shortuuidfield import ShortUUIDField | 
| 6 | 6 | from TimeConvert import TimeConvert as tc | 
| 7 | 7 |  | 
| 8 | -from pai2.basemodels import CreateUpdateMixin | |
| 8 | +from pai2.basemodels import CreateUpdateMixin, LensmanTypeMixin | |
| 9 | 9 | from photo.models import PhotosInfo | 
| 10 | 10 | from utils.qiniucdn import qiniu_file_url | 
| 11 | 11 | from utils.redis.rgroup import get_group_photo_thumbup_flag | 
| @@ -211,7 +211,7 @@ class GroupUserInfo(CreateUpdateMixin): | ||
| 211 | 211 | } | 
| 212 | 212 |  | 
| 213 | 213 |  | 
| 214 | -class GroupPhotoInfo(CreateUpdateMixin): | |
| 214 | +class GroupPhotoInfo(CreateUpdateMixin, LensmanTypeMixin): | |
| 215 | 215 | APP_GROUP = 0 | 
| 216 | 216 | SESSION_GROUP = 1 | 
| 217 | 217 |  | 
| @@ -326,6 +326,7 @@ class GroupPhotoInfo(CreateUpdateMixin): | ||
| 326 | 326 | 'porder': porder, | 
| 327 | 327 | 'created_at': created_at, | 
| 328 | 328 | 'origin_expired_stamps': origin_expired_stamps(created_at, self.user_id), | 
| 329 | + 'display_payment_btn': self.photo_from == self.SESSION_GROUP and self.lensman_type not in [self.OUTTAKE], | |
| 329 | 330 | } | 
| 330 | 331 |  | 
| 331 | 332 |  | 
| @@ -657,6 +657,7 @@ def pai2_home_api(request): | ||
| 657 | 657 | 'origin_expired_stamps': origin_expired_stamps(row[25], row[16]), | 
| 658 | 658 | 'thumbup': get_group_photo_thumbup_flag(row[5], user_id), | 
| 659 | 659 |          'porder': get_lensman_order_record(row[5], user_id) if row[21] == GroupPhotoInfo.SESSION_GROUP else {}, | 
| 660 | + 'display_payment_btn': row[21] == GroupPhotoInfo.SESSION_GROUP and row[26] not in [GroupPhotoInfo.OUTTAKE], | |
| 660 | 661 | } for row in rows] | 
| 661 | 662 |  | 
| 662 | 663 |      return response(200, 'Get Home Data Success', u'获取首页数据成功', { | 
| @@ -1,14 +1,14 @@ | ||
| 1 | 1 | # -*- coding: utf-8 -*- | 
| 2 | 2 |  | 
| 3 | -import json | |
| 4 | - | |
| 5 | 3 | from django.shortcuts import render | 
| 4 | +from json_render import json_render | |
| 6 | 5 |  | 
| 7 | 6 | from account.models import LensmanInfo, TourGuideInfo | 
| 8 | 7 | from utils.redis.connect import r | 
| 9 | 8 |  | 
| 10 | 9 |  | 
| 11 | 10 | def lensman_oauth(request): | 
| 11 | +    lensman_type = int(request.GET.get('lt') or 0) | |
| 12 | 12 |      unionid = request.GET.get('unionid', '') | 
| 13 | 13 |  | 
| 14 | 14 | try: | 
| @@ -17,8 +17,9 @@ def lensman_oauth(request): | ||
| 17 | 17 | lensman = None | 
| 18 | 18 |  | 
| 19 | 19 |      return render(request, 'page/lensman_oauth.html', { | 
| 20 | - 'lensman_info': lensman and lensman.data, | |
| 21 | - 'modified': bool((not lensman) or (lensman and lensman.user_status in [LensmanInfo.UNVERIFIED, LensmanInfo.REFUSED])), # 是否可以更改信息 | |
| 20 | + 'lensman_type': lensman_type, | |
| 21 | + 'lensman_info': lensman and lensman.data(lensman_type), | |
| 22 | + 'modified': bool((not lensman) or (lensman and lensman.modified(lensman_type))), # 是否可以更改信息 | |
| 22 | 23 | }) | 
| 23 | 24 |  | 
| 24 | 25 |  | 
| @@ -32,18 +33,18 @@ def tourguide_oauth(request): | ||
| 32 | 33 |  | 
| 33 | 34 |      return render(request, 'page/tourguide_oauth.html', { | 
| 34 | 35 | 'tourguide_info': tourguide and tourguide.data, | 
| 35 | - 'modified': bool((not tourguide) or (tourguide and tourguide.user_status in [TourGuideInfo.UNVERIFIED, TourGuideInfo.REFUSED])), # 是否可以更改信息 | |
| 36 | + 'modified': bool((not tourguide) or (tourguide and tourguide.modified)), # 是否可以更改信息 | |
| 36 | 37 | }) | 
| 37 | 38 |  | 
| 38 | 39 |  | 
| 39 | 40 | def login_qrcode(request): | 
| 41 | +    lensman_type = int(request.GET.get('lt') or 0) | |
| 40 | 42 |      unionid = request.GET.get('unionid', '') | 
| 41 | 43 |  | 
| 42 | 44 |      data = { | 
| 45 | + 'lensman_type': lensman_type, | |
| 43 | 46 | 'unionid': unionid, | 
| 44 | 47 | 'token': r.token(unionid) | 
| 45 | 48 | } | 
| 46 | 49 |  | 
| 47 | -    return render(request, 'page/login_qrcode.html', { | |
| 48 | - 'data': json.dumps(data) | |
| 49 | - }) | |
| 50 | + return json_render(request, 'page/login_qrcode.html', data) | 
| @@ -147,6 +147,7 @@ | ||
| 147 | 147 | } | 
| 148 | 148 |  | 
| 149 | 149 |                      return { | 
| 150 | +                        lensman_type: '{{ lensman_type }}', | |
| 150 | 151 | unionid: unionid, | 
| 151 | 152 |                          openid: getURLParameter('openid'), | 
| 152 | 153 | name: name, | 
| @@ -75,3 +75,32 @@ class PaiaiSrcMixin(models.Model): | ||
| 75 | 75 |  | 
| 76 | 76 | class Meta: | 
| 77 | 77 | abstract = True | 
| 78 | + | |
| 79 | + | |
| 80 | +class LensmanTypeChoicesMixin(models.Model): | |
| 81 | + NOTLENSMAN = -1 | |
| 82 | + COMMON = 0 | |
| 83 | + OUTTAKE = 10 | |
| 84 | + | |
| 85 | + LENSMAN_TYPE = ( | |
| 86 | + (COMMON, u'普通摄影师'), | |
| 87 | + (OUTTAKE, u'花絮摄影师'), | |
| 88 | + ) | |
| 89 | + | |
| 90 | + class Meta: | |
| 91 | + abstract = True | |
| 92 | + | |
| 93 | + | |
| 94 | +class LensmanTypeMixin(LensmanTypeChoicesMixin): | |
| 95 | + lensman_type = models.IntegerField(_(u'lensman_type'), choices=LensmanTypeChoicesMixin.LENSMAN_TYPE, default=LensmanTypeChoicesMixin.NOTLENSMAN, help_text=u'摄影师类别', db_index=True) | |
| 96 | + | |
| 97 | + class Meta: | |
| 98 | + abstract = True | |
| 99 | + | |
| 100 | + | |
| 101 | +class LensmanTypeBoolMixin(LensmanTypeChoicesMixin): | |
| 102 | + is_common_lensman = models.BooleanField(_(u'is_common_lensman'), default=False, help_text=u'是否为普通摄影师', db_index=True) | |
| 103 | + is_outtake_lensman = models.BooleanField(_(u'is_outtake_lensman'), default=False, help_text=u'是否为花絮摄影师', db_index=True) | |
| 104 | + | |
| 105 | + class Meta: | |
| 106 | + abstract = True | 
| @@ -10,6 +10,7 @@ django-curtail-uuid==1.0.0 | ||
| 10 | 10 | django-detect==1.0.5 | 
| 11 | 11 | django-file-md5==1.0.1 | 
| 12 | 12 | django-ip==1.0.0 | 
| 13 | +django-json-render==1.0.0 | |
| 13 | 14 | django-json-response==1.1.5 | 
| 14 | 15 | django-logit==1.0.6 | 
| 15 | 16 | django-mobi==0.1.7 | 
| @@ -19,9 +20,9 @@ django-rlog==1.0.7 | ||
| 19 | 20 | django-shortuuidfield==0.1.3 | 
| 20 | 21 | django-six==1.0.2 | 
| 21 | 22 | django-uniapi==1.0.0 | 
| 22 | -django-we==1.0.10 | |
| 23 | +django-we==1.0.12 | |
| 23 | 24 | djangorestframework==3.6.3 | 
| 24 | -furl==1.0.0 | |
| 25 | +furl==1.0.1 | |
| 25 | 26 | hiredis==0.2.0 | 
| 26 | 27 | isoweek==1.3.3 | 
| 27 | 28 | jsonfield==2.0.2 | 
| @@ -30,13 +31,13 @@ pep8==1.7.0 | ||
| 30 | 31 | pysnippets==1.0.4 | 
| 31 | 32 | pywe-jssdk==1.0.2 | 
| 32 | 33 | pywe-miniapp==1.0.0 | 
| 33 | -pywe-oauth==1.0.4 | |
| 34 | +pywe-oauth==1.0.5 | |
| 34 | 35 | pywe-pay==1.0.7 | 
| 35 | 36 | pywe-pay-notify==1.0.1 | 
| 36 | 37 | pywe-response==1.0.1 | 
| 37 | 38 | pywe-sign==1.0.6 | 
| 38 | 39 | pywe-xml==1.0.0 | 
| 39 | -qiniu==7.1.4 | |
| 40 | +qiniu==7.1.5 | |
| 40 | 41 | redis==2.10.6 | 
| 41 | 42 | redis-extensions==1.1.1 | 
| 42 | 43 | requests==2.18.4 | 
| @@ -13,6 +13,8 @@ class LensmanStatusCode(BaseStatusCode): | ||
| 13 | 13 | # 状态 | 
| 14 | 14 | LENSMAN_ALREADY_NOT_UNVERIFIED = StatusCodeField(400010, 'Lensman Already Not Unverified', description=u'摄影师帐号已激活') | 
| 15 | 15 | LENSMAN_NOT_ACTIVATED = StatusCodeField(400015, 'Lensman Not Activated', description=u'摄影师帐号未激活') | 
| 16 | + # 类别 | |
| 17 | + LENSMAN_TYPE_NOT_EXISTS = StatusCodeField(400020, 'Lensman Type Not Exists', description=u'摄影师类别不存在') | |
| 16 | 18 |  | 
| 17 | 19 |  | 
| 18 | 20 | class TourGuideStatusCode(BaseStatusCode): | 
| @@ -34,6 +36,9 @@ class UserStatusCode(BaseStatusCode): | ||
| 34 | 36 | USERNAME_HAS_REGISTERED = StatusCodeField(400503, 'Username Has Registered', description=u'用户名已注册') | 
| 35 | 37 | # 游客 | 
| 36 | 38 | GUEST_NOT_ALLOWED = StatusCodeField(400511, 'Guest Not ALLOWED', description=u'游客登录未开启') | 
| 39 | + # 身份 | |
| 40 | + USER_NOT_LENSMAN = StatusCodeField(400521, 'User Not Lensman', description=u'用户非摄影师') | |
| 41 | + USER_NOT_TOURGUIDE = StatusCodeField(400522, 'User Not Tourguide', description=u'用户非导游') | |
| 37 | 42 |  | 
| 38 | 43 |  | 
| 39 | 44 | class PhoneStatusCode(BaseStatusCode): | 
| @@ -5,7 +5,7 @@ PAI2_HOME_API = ( | ||
| 5 | 5 | r"T1.group_id, T2.group_name, T2.group_default_avatar, T2.group_avatar, T2.group_from, T3.photo_id, " | 
| 6 | 6 | r"T3.photo_path, T3.has_watermark, T3.photo_w, T3.photo_h, T3.photo_thumbnail_path, T3.photo_thumbnail_w, T3.photo_thumbnail_h, " | 
| 7 | 7 | r"T3.photo_thumbnail2_path, T3.photo_thumbnail2_w, T3.photo_thumbnail2_h, T3.user_id, T3.nickname, T3.avatar, " | 
| 8 | - r"T3.comment_num, T3.thumbup_num, T3.photo_from, T3.session_id, T3.nomark, T3.origin, T3.created_at, T3.lensman_photo_id " | |
| 8 | + r"T3.comment_num, T3.thumbup_num, T3.photo_from, T3.session_id, T3.nomark, T3.origin, T3.created_at, T3.lensman_photo_id, T3.lensman_type " | |
| 9 | 9 |      r"from (select * from group_groupuserinfo where user_id='{user_id}' and user_status=1 and status=1) as T1 " | 
| 10 | 10 | r"left outer join group_groupinfo as T2 on T1.group_id = T2.group_id " | 
| 11 | 11 | r"left outer join group_groupphotoinfo as T3 on T1.group_id = T3.group_id and T3.id > T1.current_id " |